// 交叉类型： 交叉类型是将多个类型合并为一个类型
// 联合类型： 联合类型表示一个值可以是几种类型之一
interface PersonType {
  name: string;
  age: number;
}

interface PersonState {
  sex: string;
}

const p: PersonType & PersonState = {
  name: "啊哈",
  age: 18,
  sex: "男",
};

const pp: PersonType | PersonState = {
  sex: "男",
};

// 类型保护与区分类型（Type Guards and Differentiating Types）

function len(x: number | string): number {
  if (typeof x === "number") {
    return x;
  }

  return x.length;
}

len(33);
len("哈哈哈");

// 类型保护和类型断言
const main = document.querySelector("main");
// 类型断言1
(<HTMLElement>main).addEventListener("click", () => {});
// 类型断言2
(main as HTMLElement).addEventListener("click", () => {});
// es6
main?.addEventListener("click", () => {});

// ts 非空断言
main!.addEventListener("click", () => {});

if (main) {
  main.addEventListener("click", () => {});
}

// 类型别名

type qwe = number;


const nn: qwe = 123